#include<stdio.h>
#include<stdlib.h>
/*
 * 链表实例
 */
struct Data{ //链表要存储的数据内容，可以根据需要自己定义
	int n;
};

struct Node{  //链表中的一块数据
	struct Data data;  //指向下一块数据的指针
	struct Node* next;
};

int main(){
	//定义链表的头节点并初始化	
	struct Node head;
	head.data.n = 0;
	head.next = NULL;

	//给链表加入其它块
	struct Node* tail = &head; 
	for(int i=0; i<5; i++){
		struct Node* new = (struct Node*)malloc(sizeof(struct Node));	
		new->data.n = i+1;
		new->next = NULL;
		tail->next = new;   //将新块链到链表的最后
		tail = new;         //修改tail的指向，仍然指向链表的最后一块
	}

	//遍历链表
	tail = &head;
	while(tail){
		printf("%d ",tail->data.n);
		tail = tail->next;  //最后一个节点的next一定是NULL,故循环可以结束
	}
	printf("\n");

	//清理链表
	tail = (&head)->next; //head不用清理，因为head不是动态分配出来的(malloc)
	while(tail){
		struct Node* p = tail->next;  //先拿到下一个节点的地址,否则下一步清掉tail后，就无法通过tail->next 找到下一个节点了
		free(tail);                   //释放内存
		tail = p;                     //指向下一个节点
	}

	return 0;
}

